/** 
 * @file MFlotante.java
 * 
 * @author Luis Ernesto Carrera Retana
 * @date 2009-08-22
 */

package estadistec.logica.tabla;

import estadistec.logica.tipos.TipoValor;

import estadistec.excepciones.ExcepcionFormatoNumeros;

/** 
 * Se incluye para formatear la conversión a string de los números.
 */
import java.text.DecimalFormat;

/** 
 * Clase para los valores de tipo Flotante.
 *
 * @todo Quiero definir algunas cosas para el formato de números
 * al inicio y no tener que hacerlo en cada caso.
 **/
public class MFlotante extends Medida<Float> {

	/** 
	 * Guarda el número de decimales.
	 */
	private int _noDecimales;

	/** 
	 * Guarda el formato para convertir a un string.
	 */
	private DecimalFormat _miFormato;

	/**
	 * Constructor.
	 */
	public MFlotante (String nombre, LTabla padre, Long llave) {
		_noDecimales = 2;
		_miFormato = new DecimalFormat("#####0.00");
		this._valor = null;
		this._lTabla = padre;
		this._llave = llave;
		this.setNombre(nombre);
	}

	public void setValor (Float valor) {
		this._valor = new Float(valor);
	}


	/** 
	 * @see estadistec.logica.tipos.Valores#getTipo
	 */
	public TipoValor getTipo() {
		return TipoValor.FLOTANTE;
	}

	/** 
	 * @see estadistec.logica.tipos.Valores#setNoDecimales
	 */
	public void setNoDecimales (int n) {
		this._noDecimales = n;
		char punto = '.';
		if ( n == 0 )
			punto = 0;
		_miFormato.applyPattern("#####0" + punto + "000000".substring(0,n));
	}

	/** 
	 * @see estadistec.logica.tipos.Valores#getNoDecimales
	 */
	public int getNoDecimales () {
		return this._noDecimales;
	}

	protected Float _obtenerValor (String texto) {
		return obtenerValor(texto);
	}

	protected String _obtenerTexto (Float valor) {
		return obtenerTexto(valor, this._miFormato);
	}

	/** 
	 * Método que convierte de un String que representa un flotante
	 * a un valor de tipo Float. Utiliza el constructor de \c Float
	 * y atrapa la excepción de \c NumberFormatException, para lanzar
	 * \c ExcepcionFormatoNumeros.
	 * 
	 * @param texto String que representa al posible valor.
	 *
	 * @throws ExepcionFormatoValor En caso de que java no pueda
	 * convertir a un flotante.
	 */
	static public Float obtenerValor (String texto)  
		throws ExcepcionFormatoNumeros
	{
		Float valor;
		try {
			valor = new Float(texto);
		} catch (NumberFormatException e) {
			throw new ExcepcionFormatoNumeros("Se esperaba un flotante: " + texto);
		}
		return valor;
	}

	/** 
	 * Convierte un valor de tipo Float a un string.
	 */
	static public String obtenerTexto(Float valor, DecimalFormat formato) 
	{
		return formato.format(valor);
	}

}
